package br.edu.universo.si.projeto2.infojob.client.apresentacao;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanProfissionalAssinante;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ConfirmationDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ErrorDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.InformationDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.SuccessDialogBox;
import br.edu.universo.si.projeto2.infojob.client.util.Util;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;

public class AProfissional extends DockPanel
{
	private AMenuProfissional aMenuProfissional;

	private AAlteraDadosProfissional aAlteraDadosProfissional;
	private ATopAssinante aTopAssinante;
	private ABuscaVagas aBuscaVagas;
	private ACurriculos aCurriculos;
	private ACaixaEntrada aCaixaEntrada;
	private ACaixaSaida aCaixaSaida;
	private ANovaMensagem aRealizaDenuncia;

	public AProfissional(final BeanProfissionalAssinante bProfissionalAssinante)
	{
		this.setSpacing(10);

		aTopAssinante = new ATopAssinante();
		aTopAssinante.adicionar(new HTML("Seja bem-vindo(a)!"));
		aTopAssinante.adicionar(new HTML("<b>" + bProfissionalAssinante.getConta().toUpperCase() + "</b>"));

		aMenuProfissional = new AMenuProfissional();

		this.add(aTopAssinante, DockPanel.NORTH);
		this.add(aMenuProfissional, DockPanel.WEST);

		aMenuProfissional.getAlteraContaLink().addClickListener(
				new ClickListener()
				{
					public void onClick(Widget sender)
					{
						limparCentro();

						aAlteraDadosProfissional = new AAlteraDadosProfissional(bProfissionalAssinante);
						AProfissional.this.add(aAlteraDadosProfissional, DockPanel.CENTER);
					}
		});

		// ALTERAR SENHA
		aMenuProfissional.getAlterarSenhaLink().addClickListener(
				new ClickListener() {
					public void onClick(Widget sender)
					{
						AAlteraSenha viewAlteraSenha = new AAlteraSenha(bProfissionalAssinante.getConta());

						viewAlteraSenha.center();
						viewAlteraSenha.show();
					}
		});

		// BUSCA VAGAS
		aMenuProfissional.getBuscarVagasLink().addClickListener(
				new ClickListener() {
					public void onClick(Widget sender)
					{
						limparCentro();

						aBuscaVagas = new ABuscaVagas();

						AProfissional.this.add(aBuscaVagas, DockPanel.CENTER);
					}
		});

		// BUSCA CURRICULOS
		aMenuProfissional.getCurriculoLink().addClickListener(
				new ClickListener() {
					public void onClick(Widget sender)
					{
						limparCentro();
						aCurriculos = new ACurriculos(bProfissionalAssinante.getId());
						AProfissional.this.add(aCurriculos, DockPanel.CENTER);
					}
		});

		// CAIXA DE ENTRADA
		aMenuProfissional.getCaixaEntradaMensagensLink().addClickListener(
				new ClickListener()
				{
					public void onClick(Widget sender)
					{
						limparCentro();

						aCaixaEntrada = new ACaixaEntrada();
						AProfissional.this.add(aCaixaEntrada, DockPanel.CENTER);
					}
				}
		);

		// ABRIR RELATORIO DE CURRICULOS ENVIADOS
		aMenuProfissional.getRelatorio().addClickListener(
				new ClickListener()
				{
					public void onClick(Widget sender)
					{
						AsyncCallback<String> cbRelatorio = new AsyncCallback<String>()
						{
							public void onSuccess(String result)
							{
								if(result != ""){
							    	Util.abrirRel(result);
								}else{
									InformationDialogBox informacao = new InformationDialogBox("Não foram enviados nenhum curriculo, relatorio não pode ser gerado");
									informacao.center();
									informacao.show();
								}
							};

							public void onFailure(Throwable caught) {};
						};

						Util.getService().getRelatorioCurriculoEnviado(cbRelatorio);
					}
				}
		);

		// CAIXA DE SAIDA
		aMenuProfissional.getMensagensEnviadasLink().addClickListener(
				new ClickListener()
				{
					public void onClick(Widget sender)
					{
						limparCentro();

						aCaixaSaida = new ACaixaSaida();
						AProfissional.this.add(aCaixaSaida, DockPanel.CENTER);
					}
				}
		);

		// Realiza Denuncia
		aMenuProfissional.getRealizaDenunciaLink().addClickListener(
				new ClickListener()
				{
					public void onClick(Widget sender)
					{
						limparCentro();

						aRealizaDenuncia = new ANovaMensagem(61);
						aRealizaDenuncia.show();
						aRealizaDenuncia.center();
					}
				}
		);
		
		// LOGOFF
		aMenuProfissional.getLogoffLink().addClickListener(
				new ClickListener()
				{
					@SuppressWarnings("unchecked")
					public void onClick(Widget sender)
					{
						final AsyncCallback cbSessao = new AsyncCallback()
						{
							public void onSuccess(Object result)
							{
								RootPanel.get().remove(AProfissional.this);
								RootPanel.get().add(new APrincipal());								
							};

							public void onFailure(Throwable caught)
							{
								ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao finalizar sessão: " + caught.getMessage());

								errorDialogBox.center();
								errorDialogBox.show();
							};
						};
						
						// confirmacao para encerrar a sessao
						ConfirmationDialogBox confirmDialogBox = new ConfirmationDialogBox(
								"Tem certeza que deseja efetuar logoff?",
								new ConfirmationDialogBox.ConfirmCallback()
								{
									public void execute(String btnId)
									{
										if (btnId.equalsIgnoreCase("s"))
										{
											Util.getService().logoff(cbSessao);
										}
									}
								}
						);

						confirmDialogBox.center();
						confirmDialogBox.show();
					}
				}
		);
		
		// ENCERRAR CONTA
		aMenuProfissional.getEncerraContaLink().addClickListener(
			new ClickListener()
			{
				public void onClick(Widget sender)
				{
					ConfirmationDialogBox confirmDialogBox = new ConfirmationDialogBox(
						"Tem certeza que deseja encerrar a sua conta?",
						new ConfirmationDialogBox.ConfirmCallback()
						{
							public void execute(String btnId)
							{
								if (btnId.equalsIgnoreCase("s"))
								{
									AsyncCallback cbEncerrarContaProfissional = new AsyncCallback()
									{
										public void onSuccess(Object result)
										{
											SuccessDialogBox successDialogBox = new SuccessDialogBox("Conta encerrada com sucesso!");
											successDialogBox.center();
											successDialogBox.show();
											
											RootPanel.get().remove(AProfissional.this);
											RootPanel.get().add(new APrincipal());
										};

										public void onFailure(Throwable caught)
										{
											ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao tentar encerrar conta: " + caught.getMessage());
											errorDialogBox.center();
											errorDialogBox.show();
										};
									};

									Util.getService().encerrarContaProfissional(bProfissionalAssinante, cbEncerrarContaProfissional);
								}
							}
						}
					);

					confirmDialogBox.center();
					confirmDialogBox.show();
				}
			}
		);

	}

	private void limparCentro()
	{
		if (aAlteraDadosProfissional != null)
		{
			AProfissional.this.remove(aAlteraDadosProfissional);
		}

		if (aBuscaVagas != null)
		{
			AProfissional.this.remove(aBuscaVagas);
		}

		if (aCurriculos != null)
		{
			AProfissional.this.remove(aCurriculos);
		}

		if (aCaixaEntrada != null)
		{
			AProfissional.this.remove(aCaixaEntrada);
		}

		if (aCaixaSaida != null)
		{
			AProfissional.this.remove(aCaixaSaida);
		}
	}
}